//
// Created by WQM on 2020/10/7.
//
/**
 * 链队列
 */


#ifndef TEST_LKQUEUE_H
#define TEST_LKQUEUE_H

#endif //TEST_LKQUEUE_H

const DataType NULLData;

/**
 * 定义链队列
 * */
typedef struct LinkQueueNode {
    DataType data;
    struct LinkQueueNode *next;
} LinkQueueNode;
typedef struct LinkQueue {
    struct LinkQueueNode *front, *rear;
} LKQue;
/**
 * 链队列的操作
 * 1 初始化       InitLKQue（LKQue LQ）
 * 2 判断链队列空  EmptyLKQue（LKQue LQ）
 * 3 入队列       EnLKQue（LKQue LQ，DataType x）
 * 4 出队列       OutLKQue（LKQue LQ）
 * 5 获得头结点    GetLKQue（LKQue LQ）
 * */



/**
* 1 初始化       InitLKQue（LKQue LQ）
 * return：LQ
* */
LKQue InitLKQue(LKQue LQ) {
    //生成一个结点
    LinkQueueNode *temp;
    temp = (LinkQueueNode *) malloc(sizeof(LinkQueueNode));
    LQ.front = temp;
    LQ.rear = temp;
    (LQ.front)->next = NULL;//
    return LQ;
}

/**
*判断链队列空
* */
int EmptyLKQue(LKQue LQ) {
    if (LQ.rear == LQ.front) {
        printf("空链队列\n");
        return 1;
    } else {
        printf("非空链队列\n");
        return 0;
    }
}

/**
*入队列
* */
LKQue EnLKQue(LKQue LQ, DataType x) {
    LinkQueueNode *temp;
    temp = (LinkQueueNode *) malloc(sizeof(LinkQueueNode));
    temp->data = x;
    LQ.rear->next = temp;
    temp->next = NULL;
    (LQ.rear)->next = temp;   //新结点入队列
    LQ.rear = temp;           //置新队尾结点
    return LQ;
}

/**
*出队列       OutLKQue
* */
LKQue OutLKQue(LKQue LK) {
    LinkQueueNode *temp;
    if (!EmptyLKQue(LK)) {
        temp = LK.front->next;          //首结点

        LK.front->next = temp->next;    //队列首指针指向首结点的下一个结点
        if (temp->next == NULL)         //只有一个结点的情况
            LK.front == LK.rear;
        free(temp);
        return LK;
    } else {
        exit("空链队列，无法出队列\n");
        exit(1);
    }
}

/**
* 获得头结点    GetLKQue（LKQue LK)
* */

DataType GetHeadLKQue(LKQue LK) {
    if (!EmptyLKQue(LK)) {
        DataType temp;
        temp = LK.front->next->data;
        return temp;
    } else {
        printf("空链队列，无法获得头结点\n");
        return NULLData;
    }
}
